package ihm;

import controller.*;
import java.awt.*;
import javax.swing.*;

/**
 * Main class qui gère l'interface utilisateur.
 * 
 * @author Jason
 */
public class IHMSimulation extends JFrame {

	private static final long serialVersionUID = 1L;
	
	private final int margeHautBas = 30;
	private int margeDroiteGauche = 30;
	
	private final int couleurR = 210;
	private final int couleurG = 217;
	private final int couleurB = 247;
	
	private JPanel panelDroit;
	private JPanel panelGauche;
	
	private PanelFichierSimulation panelFichierSimulation;
	private PanelPilotageManuel panelPilotageManuel;
	private PanelTraceExecution panelTraceExecution;
	private PanelStatistiques panelStatistiques;
	private PanelInfos panelInfos;
	private TableauAscenseurs tableau;
        
        private SimulationControleur simuControleur;
        private DateControleur dateControleur;
        private AscenseurControleur ascenseurControleur;
        private AlgorithmeControleur algorithmeControleur;
        private EtageControleur etageControleur;
	
	public IHMSimulation (SimulationControleur simuControleur,DateControleur dateControleur, AscenseurControleur ascenseurControleur, AlgorithmeControleur algorithmeControleur, EtageControleur etageControleur) {
            this.simuControleur = simuControleur;
            this.dateControleur = dateControleur;
            this.ascenseurControleur = ascenseurControleur;
            this.algorithmeControleur = algorithmeControleur;
            this.etageControleur = etageControleur;
            initComponents();
	}
	
	/**
	 * Initialise les composants insérés dans la fenêtre.
	 */
	private void initComponents() {
		setVisible(true);
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		setResizable(true);
		setMinimumSize(new Dimension(800, 600));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("Logiciel de simulation - Batterie d'ascenseurs");

		this.definirPolice();

		//Constructions des panels inclus dans le JPanel panelGauche.
		panelFichierSimulation = new PanelFichierSimulation(simuControleur);
		panelPilotageManuel = new PanelPilotageManuel(simuControleur,ascenseurControleur,etageControleur);
		panelTraceExecution = new PanelTraceExecution(dateControleur);
		panelStatistiques = new PanelStatistiques(this,simuControleur);
		panelInfos = new PanelInfos(couleurR, couleurG, couleurB, dateControleur, simuControleur, ascenseurControleur);
		
		//Construction des deux JPanels panelGauche et panelDroit, inclus dans la JFrame.
		this.construirePanelDroit();
		this.construirePanelGauche(margeHautBas, margeDroiteGauche);
		
		this.creerTableauAscenseurs();
		
		this.definirLayout();
                this.tableau.update();
	}
	
	/**
	 * Construction du panelDroit.
	 */
	private void construirePanelDroit() {
		panelDroit = new JPanel();
		panelDroit.setBackground(Color.WHITE);
	}
	
	/**
	 * Construction du panelGauche.
	 */
	private void construirePanelGauche(int margeHautBas, int margeDroiteGauche) {
		panelGauche = new JPanel();
		panelGauche.setBackground(new Color(couleurR, couleurG, couleurB));
		
		//Marges qui permettent de centrer les JPanels présents dans panelGauche.
		margeDroiteGauche = (this.getWidth()/4)-(panelFichierSimulation.getMinimumSize().width/2);
		panelGauche.setBorder(
				BorderFactory.createEmptyBorder(
						margeHautBas, margeDroiteGauche, margeHautBas, margeDroiteGauche
				)
		);

		GroupLayout layout = new GroupLayout(panelGauche);
		panelGauche.setLayout(layout);
		
		layout.setHorizontalGroup(
			layout.createParallelGroup(GroupLayout.Alignment.CENTER)
					.addComponent(panelFichierSimulation)
					.addComponent(panelPilotageManuel)
					.addComponent(panelTraceExecution)
					.addComponent(panelStatistiques)
					.addComponent(panelInfos)
		);
		
 		layout.setVerticalGroup(
            layout.createSequentialGroup()
            	.addComponent(panelFichierSimulation)
            	.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
                     20, 20)
            	.addComponent(panelPilotageManuel)
            	.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
                     20, 20)
            	.addComponent(panelTraceExecution)
            	.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
                     20, 20)
            	.addComponent(panelStatistiques)
            	.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
                     20, 20)
            	.addComponent(panelInfos)
 		);
	}
	
	/**
	 * Redéfinit la police par défaut des JLabels et JRadioButton.
	 */
	private void definirPolice() {
		Font policeTexte = new Font("Dialog",Font.PLAIN,13);
		UIManager.put("Label.font",policeTexte);
		UIManager.put("RadioButton.font",policeTexte);
	}
	
	/**
	 * Met en forme la fenêtre.
	 */
	private void definirLayout() {
		//1 ligne, 2 colonnes.
		this.setLayout(new GridLayout(1,2));
		this.getContentPane().add(panelGauche);
		this.getContentPane().add(panelDroit);
	}

	/**
	 * Créé le tableau d'affichage des ascenseurs.
	 */
	private void creerTableauAscenseurs() {
		panelDroit.setLayout(new BorderLayout());
		tableau = new TableauAscenseurs(ascenseurControleur);
		panelDroit.add(tableau.getScrollPane(), BorderLayout.CENTER);
	}
	
	/**
	 * Redéfinit la position d'un ascenseur.
	 * 
	 * @param numeroAscenseur	entier représentant le numéro d'un ascenseur. 
	 * @param etage				entier représentant le numéro d'un étage.
	 */
	private void afficherAscenseur(int numeroAscenseur, int etage) {
		tableau.setPositionAscenseur(numeroAscenseur, etage);
	}
}
